/*
 * Copyright (C) 2010- Peer internet solutions
 *
 * This file is part of mixare.
 *
 * This program is free software: you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License
 * for more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program. If not, see <http://www.gnu.org/licenses/>
 */
package com.multitrack.map.mixare.data;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;
import android.util.Log;

import com.multitrack.datatype.CurrLocationList;
import com.multitrack.datatype.MemberGPSList;
import com.multitrack.map.mixare.Marker;
import com.multitrack.map.mixare.MixView;
import com.multitrack.map.mixare.POIMarker;
import com.multitrack.map.mixare.SocialMarker;
import com.multitrack.map.mixare.data.DataSource.DATAFORMAT;
import com.multitrack.util.EventSQLite;

// JSON 파일을 다루는 클래스
public class Json extends DataHandler {

	// 각종 데이터를 로드
	public List<Marker> load(JSONObject root, DATAFORMAT dataformat) {
		// 데이터를 읽는데 사용할 JSON 객체와 데이터행렬, 마커들
		JSONArray dataArray = null;
		List<Marker> markers = new ArrayList<Marker>();
		
		try {
			// 각 스키마에 따른 데이터를 읽어온다
			// 트위터
			if (root.has("results"))
				dataArray = root.getJSONArray("results");
			// 위키피디아
			else if (root.has("geonames"))
				dataArray = root.getJSONArray("geonames");
			// 구글 버즈
			else if (root.has("data")
					&& root.getJSONObject("data").has("items"))
				dataArray = root.getJSONObject("data").getJSONArray("items");

			// 데이터행렬에 데이터들이 있다면
			if (dataArray != null) {
				// 일단 로그 생성. 데이터 포맷을 기록한다
				Log.i(MixView.TAG, "processing " + dataformat
						+ " JSON Data Array");
				// 최대 객체 수와 실제 데이터 길이를 비교해 최소치를 탑으로 지정

				// 각 데이터들에 대한 처리
				for (int i = 0; i < MixView.currLocList.size(); i++) {
					// 처리할 JSON 객체를 할당
					Marker ma = null;

					ma = processMixareJSONObject(
							MixView.currLocList.get(i).getName(),
							MixView.currLocList.get(i).getLat(),
							MixView.currLocList.get(i).getLon(),
							MixView.currLocList.get(i).getAlt());
					
//					ma = processMixareJSONObject(i);
					// 마커 추가
					if (ma != null)
						markers.add(ma);
				}
			}
		} catch (JSONException e) {
			e.printStackTrace();
		}

		// 모든 마커가 추가된 리스트를 리턴
		return markers;
	}

	// 자체 데이터의 처리
	public Marker processMixareJSONObject(String name, double lat, double lon, double alt)
			throws JSONException {

		Marker ma = null; // 임시객체

		// 할당된 값들로 마커 생성
//		 ma = new POIMarker(
//		 name,
//		 lat,
//		 lon,
//		 alt,
//		 null,
//		 DataSource.DATASOURCE.OWNURL);
		

		ma = new SocialMarker(name, lat, lon, alt, null,
				DataSource.DATASOURCE.OWNURL);

		return ma; // 마커 리턴
	}

	// html 엔트리의 해쉬맵
	private static HashMap<String, String> htmlEntities;
	static {
		htmlEntities = new HashMap<String, String>();
		htmlEntities.put("&lt;", "<");
		htmlEntities.put("&gt;", ">");
		htmlEntities.put("&amp;", "&");
		htmlEntities.put("&quot;", "\"");
		htmlEntities.put("&agrave;", "à");
		htmlEntities.put("&Agrave;", "À");
		htmlEntities.put("&acirc;", "â");
		htmlEntities.put("&auml;", "ä");
		htmlEntities.put("&Auml;", "Ä");
		htmlEntities.put("&Acirc;", "Â");
		htmlEntities.put("&aring;", "å");
		htmlEntities.put("&Aring;", "Å");
		htmlEntities.put("&aelig;", "æ");
		htmlEntities.put("&AElig;", "Æ");
		htmlEntities.put("&ccedil;", "ç");
		htmlEntities.put("&Ccedil;", "Ç");
		htmlEntities.put("&eacute;", "é");
		htmlEntities.put("&Eacute;", "É");
		htmlEntities.put("&egrave;", "è");
		htmlEntities.put("&Egrave;", "È");
		htmlEntities.put("&ecirc;", "ê");
		htmlEntities.put("&Ecirc;", "Ê");
		htmlEntities.put("&euml;", "ë");
		htmlEntities.put("&Euml;", "Ë");
		htmlEntities.put("&iuml;", "ï");
		htmlEntities.put("&Iuml;", "Ï");
		htmlEntities.put("&ocirc;", "ô");
		htmlEntities.put("&Ocirc;", "Ô");
		htmlEntities.put("&ouml;", "ö");
		htmlEntities.put("&Ouml;", "Ö");
		htmlEntities.put("&oslash;", "ø");
		htmlEntities.put("&Oslash;", "Ø");
		htmlEntities.put("&szlig;", "ß");
		htmlEntities.put("&ugrave;", "ù");
		htmlEntities.put("&Ugrave;", "Ù");
		htmlEntities.put("&ucirc;", "û");
		htmlEntities.put("&Ucirc;", "Û");
		htmlEntities.put("&uuml;", "ü");
		htmlEntities.put("&Uuml;", "Ü");
		htmlEntities.put("&nbsp;", " ");
		htmlEntities.put("&copy;", "\u00a9");
		htmlEntities.put("&reg;", "\u00ae");
		htmlEntities.put("&euro;", "\u20a0");
	}

	// HTML 아스키 값들을 다시 복원. 변환할 소스와 시작점을 인자로 받는다
	public String unescapeHTML(String source, int start) {
		int i, j; // 임시 변수

		// &와 ;의 위치로 값들을 읽는다
		i = source.indexOf("&", start);
		if (i > -1) {
			j = source.indexOf(";", i);
			if (j > i) {
				// 검색된 위치에서 값을 읽어옴
				String entityToLookFor = source.substring(i, j + 1);
				String value = (String) htmlEntities.get(entityToLookFor);

				// 값이 있을 시 복원작업 시작. 재귀호출 이용
				if (value != null) {
					source = new StringBuffer().append(source.substring(0, i))
							.append(value).append(source.substring(j + 1))
							.toString();
					return unescapeHTML(source, i + 1); // recursive call
				}
			}
		}
		return source; // 복원된 소스 리턴
	}
}